// 枚举的功能类似于字面量类型+联合类型的组合功能,也可以表示一组明确的可选值
// 枚举:定义一组命名常量。它描述一个值，该值可以是这些命名常量的钟的一个

enum Direction{Up,Down,Left,Right}

function changeDirecion(direction:Direction){
    console.log(direction)
}

/**
 * 解释：
 * 1.使用enum关键字定义枚举
 * 2.约定枚举名称枚举中的值以大写字母开头
 * 3.枚举中的多个值之间通过逗号分割
 * 4.定义好枚举后直接使用枚举名称作为类型注解
 */

console.log(Direction.Down)

/**
 * 解释:通过将鼠标移入Direction.Up,可以看到枚举成员Up的值为0
 * 注意:枚举成员是有值的，默认为：从零开始至尊的数值
 * 我们把枚举成员的值作为数字的枚举，称为数字枚举
 * 当然也可以给枚举的成员初始化值
 */
enum Direction2{Up=10,Down,Left,Right}

enum Direction3{Up=2,Down=4,Left=8,Right=16}

//字符串枚举：枚举成员的值是字符串

enum Direction4{
    Up="Up",
    Down="Down",
    Left="Left",
    Right="Right"
}

// 注意:字符串枚举没有自增长行为,因此,字符串枚举的每一个成员必须有初始值

/**
 * 枚举是 ts 中为数不多不的非 JavaScript 类型级扩展的特性之一
 * 因为其他类型仅仅被当作类型，而枚举不仅运作类型还提供直
 * 也就是说其他的类型会在编译为js代码时自动移除，但是枚举类型会被编译为js代码
 * 说明：枚举前面讲到的字面量类型加联合类型组合的功能相似，都用来表示一组明确的可选值列表
 * 一般情况下，推荐使用字面量类型+联合类型的组合的方式，因为相比民主这种方式更加直观、简洁、高效
 */

//上面的ts代码编译后就是下面这样
// var Direction;
// (function(Direction){
//     Direction["Up"]="Up";
//     Direction["Down"]="Down"
//     Direction["Left"]="Left"
//     Direction["Right"]="Right"
// })(Direction||(Direction={}))
